package com.owen.springboot.smartparkingms.module.app.util;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.owen.springboot.smartparkingms.common.util.DateUtils;
import com.owen.springboot.smartparkingms.module.app.entity.CarParkRecord;
import com.owen.springboot.smartparkingms.module.app.entity.Park;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;

/**
 * 计算费用
 */
public class CostUtils {

    /**
     * 计算停车场费用
     * @param record
     * @param park
     * @return
     */
    public static BigDecimal calculate(CarParkRecord record, Park park){
        long minutes = takeTime(record, park); //计算停车时长
        if(minutes>0){  // 若总时长大于免费时长，则开始计算费用，否则免费
            BigDecimal count = NumberUtil.div(new BigDecimal(minutes),park.getTimeUnit());  // 总时长除以停车场计费单元时长
            count = NumberUtil.round(count,0, RoundingMode.UP);  // 进一取整
            BigDecimal cost = NumberUtil.mul(count,park.getUnitCost()); // 单元时长乘以单元费用
            cost = NumberUtil.round(cost,2); // 四舍五入，保留两位
            if(cost.compareTo(park.getMaxMoney())>1){  //若超出最高上限，则按最高上限收费
                return park.getMaxMoney();
            }
            return cost;
        }else{
            return new BigDecimal(BigInteger.ZERO);
        }
    }

    /**
     * 计算停车时长
     * @param record
     * @param park
     * @return
     */
    public static long takeTime(CarParkRecord record, Park park){
        long minutes = DateUtil.between(record.getGmtInto(),
                DateUtils.getTimestamp(), DateUnit.MINUTE);  // 计算停车场总时长
        minutes = minutes - park.getFreeTime();   // 除去免费时长
        if(minutes>0){
            return minutes;
        }else{
            return 0;
        }
    }

    public static void main(String[] args) {
        BigDecimal count = new BigDecimal(0.91);
        count = NumberUtil.round(count,0, RoundingMode.UP);
        System.out.println(count);
    }
}
